/**************************************************************************** 
 * Meta，一个轻量级的静态分区Hypervisor 
 *
 * 版权(c) , 2022-
 *
 * 作者:
 *      Tupelo Shen <shenwanjiang2013@163.com>
 *
 * Meta是一个自由软件，你可以在遵循GNU GPLv2协议的条件下，重新修改并发布它。
 *
 ***************************************************************************/

#ifndef __OBJCACHE_H__
#define __OBJCACHE_H__

#include <meta.h>
#include <mem.h>
#include <list.h>
#include <spinlock.h>

#define SLAB_SIZE PAGE_SIZE
#define SLAB_MIN_HEADER_SIZE (32)
#define SLAB_MAX_OBJECT_SIZE (PAGE_SIZE / 4)

struct objcache;
union slab;

struct objcache {
    size_t          osize;
    struct list     slabs;
    union slab*     last_free;
    spinlock_t      lock;
    enum AS_SEC section;
};

void    objcache_init(struct objcache* oc, size_t osize, enum AS_SEC sec, bool prime);
void*   objcache_alloc();
bool    objcache_free(struct objcache* oc, void* obj);

#endif /* __OBJCACHE_H__ */
